package net.suplementos.negocio;

import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import net.suplementos.exception.CampoObrigatorioException;
import net.suplementos.exception.ErroInternoException;
import net.suplementos.exception.RegistroInexistenteException;
import net.suplementos.exception.RegistroJaExistenteException;
import net.suplementos.pojo.Categoria;
import net.suplementos.pojo.FormaPagamento;
import net.suplementos.pojo.Marca;
import net.suplementos.pojo.ParametroSistema;
import net.suplementos.pojo.Perfil;
import net.suplementos.pojo.Produto;
import net.suplementos.pojo.Usuario;
import net.suplementos.pojo.UsuarioPerfil;
import net.suplementos.servico.CadastroServico;

public class CadastroDelegate implements CadastroServico {

    private static CadastroServico delegate;
    private InitialContext context;
    
    private CadastroDelegate() {
        try {
            context = new InitialContext();
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }
    
    public static CadastroServico getInstance() {
        if (delegate == null) {
            delegate = new CadastroDelegate();
        }
        
        return delegate;
    }
    
    private CadastroServico getRemote() {
        try {
            return (CadastroServico) context.lookup("/net/suplementos/facade/Cadastro/remote");
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }
    

	public List<Categoria> consultar(Categoria categoria) throws CampoObrigatorioException {
	    return getRemote().consultar(categoria);
	}

	public List<Categoria> listarTodasCategoriasAtivas() {
	    return getRemote().listarTodasCategoriasAtivas();
	}

	public Categoria getCategoria(Integer id) {
	    return getRemote().getCategoria(id);
	}

	public void alterar(Categoria categoria) throws CampoObrigatorioException, RegistroJaExistenteException, RegistroInexistenteException {
	    getRemote().alterar(categoria);
	}

	public void salvar(Categoria categoria) throws CampoObrigatorioException, RegistroJaExistenteException {
	    getRemote().salvar(categoria);
	}

	/*
	 * Marca
	 */
	public List<Marca> consultar(Marca marca) throws CampoObrigatorioException {
	    return getRemote().consultar(marca);
	}
	
	public List<Marca> listarTodasMarcasAtivas() {
	    return getRemote().listarTodasMarcasAtivas();
	}

	public Marca getMarca(Integer id) {
	    return getRemote().getMarca(id);
	}

	public void alterar(Marca marca) throws CampoObrigatorioException, RegistroJaExistenteException, RegistroInexistenteException {
	    getRemote().alterar(marca);
	}

	public void salvar(Marca marca) throws CampoObrigatorioException, RegistroJaExistenteException {
	    getRemote().salvar(marca);
	}

	/*
	 * Forma pagamento
	 */
	public List<FormaPagamento> listarTodasFormasPagamento() {
	    return getRemote().listarTodasFormasPagamento();
	}

	public List<FormaPagamento> listarTodasFormasPagamentoAtivas() {
	    return getRemote().listarTodasFormasPagamentoAtivas();
	}

	public FormaPagamento getFormaPagamento(Integer id) {
	    return getRemote().getFormaPagamento(id);
	}

	public void alterar(FormaPagamento formaPagamento) throws CampoObrigatorioException, RegistroJaExistenteException, RegistroInexistenteException {
	    getRemote().alterar(formaPagamento);
	}

	public void salvar(FormaPagamento formaPagamento) throws CampoObrigatorioException, RegistroJaExistenteException {
	    getRemote().salvar(formaPagamento);
	}
	
	/*
	 * Parametro Sistema
	 */
	public List<ParametroSistema> listarTodosParametrosSistema() {
	    return getRemote().listarTodosParametrosSistema();
	}

	public ParametroSistema getParametroSistema(String codigo) {
	    return getRemote().getParametroSistema(codigo);
	}

	public void alterar(String codigo, String valor) throws CampoObrigatorioException, RegistroInexistenteException {
	    getRemote().alterar(codigo, valor);
	}

	/*
	 * Produto
	 */
	public List<Produto> consultar(Produto produto) throws CampoObrigatorioException {
	    return getRemote().consultar(produto);
	}

	public List<Produto> listarTodosProdutosAtivos() {
	    return getRemote().listarTodosProdutosAtivos();
	}

	public Produto getProduto(Integer id) {
	    return getRemote().getProduto(id);
	}

	public void alterar(Produto produto) throws CampoObrigatorioException, RegistroJaExistenteException, RegistroInexistenteException {
	    getRemote().alterar(produto);
	}

	public void salvar(Produto produto) throws CampoObrigatorioException {
	    getRemote().salvar(produto);
	}
	
	/*
	 * Usuario
	 */
	public List<Usuario> consultar(Usuario usuario) throws CampoObrigatorioException {
	    return getRemote().consultar(usuario);
	}

	public Usuario getUsuario(Integer id) {
	    return getRemote().getUsuario(id);
	}

	public void alterar(Usuario usuario) throws CampoObrigatorioException, RegistroJaExistenteException, RegistroInexistenteException {
	    getRemote().alterar(usuario);
	}

	public void salvar(Usuario usuario) throws CampoObrigatorioException, RegistroJaExistenteException {
	    getRemote().salvar(usuario);
	}
	
	/*
	 * Usuario Perfil
	 */
	public List<UsuarioPerfil> listarTodosPerfisUsuario(Usuario usuario) throws CampoObrigatorioException {
	    return getRemote().listarTodosPerfisUsuario(usuario);
	}
	
	public List<UsuarioPerfil> listarTodosPerfis() {
	    return getRemote().listarTodosPerfis();
	}

	public void desassociarUsuarioPerfil(Usuario usuario, Perfil perfil, Usuario usadoAlteracao) 
	    throws CampoObrigatorioException, RegistroInexistenteException {
	    getRemote().desassociarUsuarioPerfil(usuario, perfil, usadoAlteracao);
	}

	public void associarUsuarioPerfil(Usuario usuario, Perfil perfil, Usuario usadoAlteracao) 
	    throws CampoObrigatorioException, RegistroJaExistenteException {
	    getRemote().associarUsuarioPerfil(usuario, perfil, usadoAlteracao);
	}
}
